home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / fsw / zm302 / zm302_l.lzh / FOPEN.HAS < prev    next >
Text File  |  1996-12-01  |  5KB  |  322 lines

  1. fopen:                    *ファイルのオープン(環境変数参照モード)
  2.     * < a2=file name
  3.     * > d5=file handle (error:d5<0)
  4.     * - all 
  5. reglist    reg    d0-d1/a0-a2
  6.     movem.l    reglist,-(sp)
  7.     move.l    a2,fopen_name-work(a6)
  8.     moveq.l    #0,d0
  9.     move.l    d0,getname+10-work(a6)    *go_fopenにエントリが1回目であることをマーク
  10. fopnlp00:
  11.     move.b    (a2)+,d1
  12.     beq    fopn0
  13.     cmpi.b    #'\',d1            *init.
  14.     bne    @f
  15.     moveq.l    #0,d0
  16.     bra    fopnlp00
  17. @@:
  18.     cmpi.b    #'/',d1            *init.
  19.     bne    @f
  20.     moveq.l    #0,d0
  21.     bra    fopnlp00
  22. @@:
  23.     cmp.b    #'.',d1
  24.     bne    fopnlp00
  25.     move.l    a2,d0            *拡張子があるならばその位置をメモ
  26.     bra    fopnlp00
  27. fopn0:                    *拡張子転送
  28.     lea    getname+6-work(a6),a1
  29.     tst.l    d0            *拡張子無しケース
  30.     beq    no_ext_fopn
  31.     move.b    #'_',(a1)+        *zmusic_
  32.     move.l    d0,a0
  33. @@:
  34.     move.b    (a0)+,d0        *拡張子をzmusic_XXXのXXXの部分に設定
  35.     beq    @f
  36.     bsr    mk_capital
  37.     move.b    d0,(a1)+
  38.     bra    @b
  39. @@:
  40.     clr.b    (a1)+            *end code
  41.     movem.l    (sp)+,reglist
  42.     bsr    go_fopen
  43.     tst.l    d5
  44.     bmi    @f
  45.     rts
  46. no_ext_fopn:
  47.     movem.l    (sp)+,reglist
  48. @@:
  49.     clr.w    getname+6-work(a6)
  50.     st.b    getname+13-work(a6)    *go_fopenにエントリが2回目であることをマーク
  51.  
  52. reglist    reg    d0-d2/a0-a3
  53.     movem.l    reglist,-(sp)
  54.     bra    @f
  55.  
  56. go_fopen:
  57.     * < a2=file name
  58.     * > d5=file handle (error:d5<0)
  59.     * - all 
  60.     movem.l    reglist,-(sp)
  61.  
  62.     bsr    check_drvchg
  63.     bmi    @f
  64.     clr.w    -(sp)
  65.     pea     (a2)
  66.     DOS    _OPEN
  67.     addq.w    #6,sp
  68.     move.l    d0,d5        *d5.w=file handle
  69.     bpl    get_file_info    *no problem
  70. @@:
  71.     movea.l    a2,a0        *a0=file name only(non pathed)
  72.  
  73.     pea    getname(pc)
  74.     bsr    search_env
  75.     addq.w    #4,sp
  76.     tst.l    d0
  77.     beq    exit_fopen
  78.     move.l    d0,a1
  79. fo0:
  80.     moveq.l    #0,d1
  81.     move.l    open_fn(pc),a2
  82. fopen_lp01:
  83.     tst.l    d1
  84.     bne    cont_standard_dir
  85.     move.b    (a1)+,d0
  86.     cmpi.b    #'/',d0
  87.     beq    standard_dir
  88.     cmpi.b    #'-',d0
  89.     beq    standard_dir
  90.     subq.w    #1,a1
  91.     moveq.l    #0,d1
  92. fopen_lp02:
  93.     move.b    (a1)+,d0
  94.     beq    do_fopen
  95.     cmpi.b    #';',d0
  96.     beq    do_fopen
  97.     move.b    d0,(a2)+
  98.     bra    fopen_lp02
  99. cont_standard_dir:
  100.     move.l    d1,a1
  101.     bra    subptlp
  102. standard_dir:
  103.     tst.b    getname+13-work(a6)
  104.     beq    @f
  105.     move.b    (a1)+,getname+6-work(a6)    *go_fopen1回目
  106.     bra    1f
  107. @@:
  108.     move.b    (a1)+,getname+10-work(a6)    *go_fopen2回目
  109. 1:
  110.     pea    getname-work(a6)
  111.     bsr    search_env
  112.     addq.w    #4,sp
  113.     tst.l    d0
  114.     beq    exit_fopen
  115.     move.l    d0,a3
  116.     move.l    a1,d1
  117. subptlp:
  118.     move.b    (a1)+,d0
  119.     beq    @f
  120.     cmpi.b    #';',d0
  121.     beq    @f
  122.     move.b    d0,(a2)+
  123.     bra    subptlp
  124. @@:
  125.     moveq.l    #'\',d0        *余計な'\'記号の削除
  126. subptlp0:
  127.     cmp.b    -1(a2),d0
  128.     bne    subpt0
  129.     move.b    -2(a2),d2
  130.     bsr    chk_knj
  131.     bmi    subpt0
  132.     subq.w    #1,a2
  133.     bra    subptlp0
  134. subpt0:
  135. @@:
  136.     cmp.b    (a3),d0
  137.     bne    @f
  138.     addq.w    #1,a3
  139.     bra    @b
  140. @@:
  141.     move.b    d0,(a2)+
  142. @@:
  143.     move.b    (a3)+,d0
  144.     beq    @f
  145.     cmpi.b    #';',d0
  146.     beq    do_fopen
  147.     move.b    d0,(a2)+    *DIR名の転送
  148.     bra    @b
  149. @@:
  150.     moveq.l    #0,d1
  151. do_fopen:
  152.     pea    (a0)
  153.     moveq.l    #'\',d0        *余計な'\'記号の削除
  154. subptlp1:
  155.     cmp.b    -1(a2),d0
  156.     bne    subpt1
  157.     move.b    -2(a2),d2
  158.     bsr    chk_knj
  159.     bmi    subpt1
  160.     subq.w    #1,a2
  161.     bra    subptlp1
  162. subpt1:
  163. @@:
  164.     cmp.b    (a0),d0
  165.     bne    @f
  166.     addq.w    #1,a0
  167.     bra    @b
  168. @@:
  169.     move.b    d0,(a2)+
  170. do_fopenlp:
  171.     move.b    (a0)+,(a2)+
  172.     bne    do_fopenlp
  173.     clr.b    (a2)
  174.     move.l    (sp)+,a0
  175.  
  176.     move.l    open_fn(pc),a2
  177.     bsr    check_drvchg
  178.     bmi    @f
  179.  
  180.     clr.w    -(sp)
  181.     pea    (a2)
  182.     DOS    _OPEN
  183.     addq.w    #6,sp
  184.     move.l    d0,d5        *d5.w=file handle
  185.     bpl    get_file_info    *no problem
  186. @@:
  187.     tst.l    d1
  188.     bne    fopen_lp01
  189.     tst.b    -1(a1)        *まだ環境変数が残ってるか
  190.     bne    fopen_lp01
  191. exit_fopen:
  192.     moveq.l    #-1,d5
  193.     movem.l    (sp)+,reglist
  194.     rts
  195.  
  196. chk_knj:
  197.     tst.b    d2
  198.     bpl    @f        *normal characters
  199.     cmpi.b    #$a0,d2        *漢字か
  200.     bcs    ckanji_yes
  201.     cmpi.b    #$df,d2
  202.     bls    @f
  203. ckanji_yes:
  204.     move.w    #CCR_NEGA,ccr    *yes
  205.     rts
  206. @@:
  207.     move.w    #CCR_ZERO,ccr    *no
  208.     rts
  209.  
  210. get_file_info:
  211.     * < a2.l=オープン成功したファイル名文字列
  212.     move.w    #32,-(sp)
  213.     pea    (a2)
  214.     pea.l    file_info_buf(pc)
  215.     DOS    _FILES
  216.     lea    10(sp),sp
  217.     movem.l    (sp)+,reglist
  218.     rts
  219.  
  220. search_env:
  221.     movem.l    a0-a1,-(sp)
  222.     DOS    _GETPDB
  223.     move.l    d0,a1        *環境変数文字列群
  224.     move.l    (a1),a1
  225.     addq.w    #4,a1
  226.     tst.b    (a1)
  227.     beq    err_exit_sen    *環境変数なし
  228. sen_lp00:
  229.     move.l    2*4+4(sp),a0    *サーチ環境変数名
  230. sen_lp01:
  231.     move.b    (a1)+,d0
  232.     cmpi.b    #'=',d0
  233.     bne    @f
  234.     moveq.l    #0,d0
  235. @@:
  236.     cmp.b    (a0)+,d0
  237.     bne    skip_next_en
  238.     tst.b    d0
  239.     bne    sen_lp01
  240.     move.l    a1,d0
  241.     bra    exit_sen
  242. skip_next_en:
  243.     tst.b    (a1)+
  244.     bne    skip_next_en
  245.     tst.b    (a1)
  246.     bne    sen_lp00
  247. err_exit_sen:
  248.     moveq.l    #0,d0        *error
  249. exit_sen:
  250.     movem.l    (sp)+,a0-a1
  251.     rts
  252.  
  253. get_fsize:            *ファイルサイズの偶数調整なし
  254.     * < d5.w=file handle
  255.     * > d3.l=data size
  256.     * > mi=err
  257.     * X d0
  258.     * - d5
  259.     move.w    #2,-(sp)    *ファィルの長さを調べる
  260.     clr.l    -(sp)
  261.     move.w    d5,-(sp)
  262.     DOS    _SEEK
  263.      addq.w    #8,sp        *d0.l=file length
  264. gf0:
  265.     move.l    d0,d3        *d3=length
  266.     ble    @f
  267.  
  268.     clr.w    -(sp)        *ファイルポインタを元に戻す
  269.     clr.l    -(sp)
  270.     move.w    d5,-(sp)
  271.     DOS    _SEEK
  272.     addq.w    #8,sp
  273.     moveq.l    #0,d0
  274.     rts
  275. @@:
  276.     bsr    do_fclose
  277.     moveq.l    #-1,d0
  278.     rts
  279.  
  280. do_fclose:
  281.     move.w    d5,-(sp)    *close
  282.     DOS    _CLOSE
  283.     addq.w    #2,sp
  284.     rts
  285.  
  286. check_drvchg:
  287.     * < a2.l=path
  288.     * > zero:no problem
  289.     * > minus:error
  290.     * x d0
  291.     move.b    (a2),d0
  292.     bsr    chk_kanji
  293.     bmi    check_current
  294.     cmpi.b    #':',1(a2)
  295.     bne    check_current
  296.     bsr    mk_capital
  297.     cmpi.b    #'A',d0
  298.     bcs    check_current
  299.     cmpi.b    #'Z',d0
  300.     bhi    check_current
  301.     sub.b    #$40,d0
  302.     bra    @f
  303. check_current:
  304.     moveq.l    #0,d0
  305. @@:
  306.     move.w    d0,-(sp)
  307.     DOS    _DRVCTRL
  308.     addq.w    #2,sp
  309.     btst.l    #1,d0
  310.     beq    not_ready_chkdrv
  311.     moveq.l    #0,d0        *no error mark
  312.     rts
  313.  
  314. not_ready_chkdrv:
  315.     moveq.l    #-1,d0        *error mark
  316.     rts
  317.     *         0123456789
  318. getname:    dc.b    'zmusic_???'
  319.         dc.l    0    *最下位バイトはフラグにもなっている
  320. file_info_buf:    ds.b    54        *ファイル情報一時格納バッファ
  321.     .even
  322.